package demo1;

/**
 * 1.如何获取 实例内部类对象？
 * 2.在实例内部类中
 * JDK17之后，可以直接在实例内部类中定义 static
 * 但是还是建议 定义为 public static final int data6 = 6
 * 3.当外部类中数据成员 和 内部类中的数据成员 一样的时候 默认访问为内部成员
 * 如果的确想访问外部类成员 则需要 OuterClass.this.+成员数据
 * 实例内部类当中 是包含外部类的this的
 * System.out.println(OuterClass.this.data2);
 */
class OuterClass {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;

    class  InnerClass{
        public int data1 = 111;
        public int data4 = 4;
        private int data5 = 5;

//        public static int data6;
//新版本的jdk中，在非静态内部类中可以定义静态变量，但这个静态变量必须是编译时常量
        //但还是写成 public static final int data6 = 6；好一些
        public static final int data6 = 6;
        public void test() {
            System.out.println(data1);//如果外部类和内部类出现重名的成员变量，优先访问内部类的
            System.out.println(OuterClass.this.data1);//如果想要访问外部类的 需要 外部类名 + . + this + 成员变量
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(OuterClass.this.data2);
            System.out.println("内部类的test方法");
        }
    }
    public void test() {
        System.out.println("外部类的test方法");
        System.out.println(data1);
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.data4);

    }

}

public class Test2 {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
        innerClass.test();//获取实例内部类的对象时候，需要依赖与外部类对象

    }
}
